package main

import (
	"flag"
	"fmt"
	"io/ioutil"
	"log"
	"os"
	"strings"
	"water"
)

func main() {

	addCmd := flag.NewFlagSet("add", flag.ExitOnError)
	verifyCmd := flag.NewFlagSet("verify", flag.ExitOnError)

	// "add" 子命令的参数
	addText := addCmd.String("text", "", "输入的文本")
	addWatermark := addCmd.String("watermark", "", "水印内容")
	addPosition := addCmd.String("position", "right", "水印位置 (left/right)")
	output := addCmd.String("output", "output.txt", "输出文件名")

	// "verify" 子命令的参数
	verifyFile := verifyCmd.String("file", "", "输入文件名")
	verifyPosition := verifyCmd.String("position", "right", "水印位置 (left/right)")

	// 解析命令行参数
	if len(os.Args) < 2 {
		fmt.Println("使用方法:")
		fmt.Println("  add -text [文本] -watermark [水印内容] -position [水印位置]")
		fmt.Println("  verify -file [输入文件名] -position [水印位置]")
		return
	}

	switch os.Args[1] {
	case "add":
		addCmd.Parse(os.Args[2:])
		if *addText == "" || *addWatermark == "" {
			log.Fatal("请输入文本和水印内容")
		}
		txt := addWatermarkToText(*addText, *addWatermark, *addPosition)
		ioutil.WriteFile(*output, []byte(txt), 0644)
	case "verify":
		verifyCmd.Parse(os.Args[2:])
		if *verifyFile == "" {
			log.Fatal("请输入文件名")
		}
		verifyWatermarkInFile(*verifyFile, *verifyPosition)
	default:
		fmt.Println("未知的命令")
	}
}

// 将水印添加到文本并输出结果
func addWatermarkToText(text, watermark, position string) string {
	var pos water.Position
	switch position {
	case "left":
		pos = water.PositionLeft
	case "right":
		pos = water.PositionRight
	default:
		log.Fatal("无效的水印位置，仅支持 left 和 right")
	}

	var txt string
	if strings.HasPrefix(text, "@") {
		// 以文件路径形式输入文本
		filePath := strings.TrimPrefix(text, "@")
		content, err := ioutil.ReadFile(filePath)
		if err != nil {
			log.Fatalf("无法读取文件：%s", err)
		}
		txt = string(content)
	} else {
		// 直接的文本输入
		txt = text
	}

	return water.SetWatermark(txt, pos, watermark)
}

// 在文件中校验水印
func verifyWatermarkInFile(file, position string) {
	content, err := os.ReadFile(file)
	if err != nil {
		log.Fatal(err)
	}

	var pos water.Position
	switch position {
	case "left":
		pos = water.PositionLeft
	case "right":
		pos = water.PositionRight
	default:
		log.Fatal("无效的水印位置，仅支持 left 和 right")
	}

	watermark, err := water.GetWatermark(string(content), pos)
	if err != nil {
		log.Fatal(err)
	}

	fmt.Println(watermark)
}
